#ifndef LOGDIRCTRL_H
#define LOGDIRCTRL_H
#include <algorithm>
#include <vector>
#include <string>
#include <unistd.h>
#include <dirent.h>
#include <sys/stat.h>  
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <iostream> 
#include <pthread.h>

using namespace std;

#define     POKY_LOG_DIR            "/pokyLog/"               //日志目录
#define     LOG_DIR_MAX_SIZE        1024*1024*10                                   //日志目录最大容量 10MB
#define     LOG_ONE_FILE_MAX_SIZE   1024*3                                  	//单个文件最大容量 

#define     LOG_FILE_PRE            "flymap_app_"                               //日志文件的前缀
#define     LOG_FILE_MONITORING     "poky_monitoring"                           //日志文件的前缀
#define     LOG_FILE_LAST           ".a311d_log"                                      //日志文件的后缀
#define     POKY_LOG_NAME_SIZE      200
#define     LOG_TIME_LEN            19 //2020_07_03_13_05_06
#define     MAX_LOG_FILE_COUNTS     100  //超过多少个文件自动删除
#define     DEL_LOG_FILE_COUNTS     50  //超过多少个文件自动删除
#define     DIR_MAX_SIZE        1024*1024*5                                  //image目录最大容量 1G
#define     IMAGEDIR    1
#define     FLYMAPOUTDIR 2
#define     MAX_DIR_COUNTS     5  //自动删除多少个目录

typedef struct
{
    long time;        //时间字符串去掉横线
    char FileName[64];   //日志文件名
  
}LOGFILE_INFO, *pLOGFILE_INFO;

typedef struct
{
    long time;        //目录创建时间
    char DirName[64];   //目录名
  
}ImageDir_INFO, *pImageDir_INFO;

typedef struct
{
    long time;        //目录创建时间
    char DirName[64];   //目录名
  
}FlyMapOutDir_INFO, *pFlyMapOutDir_INFO;



typedef vector<int> LOG_PokyFile;

typedef vector<LOGFILE_INFO> LOG_PokyTimeFile;

typedef vector<ImageDir_INFO>Image_PokyTimeFile;

typedef vector<FlyMapOutDir_INFO>FlyMapOut_PokyTimeFile;


class LogDirCtrl
{
public:
    LogDirCtrl();
    virtual ~LogDirCtrl();
  
    
    /**
     * 
     */
    bool LogDirCtrl_Init(char** _pszFileName);
    
    /**
     * 
     */
    void LogDirCtrl_Relese();
    

private:  
    
    static bool Workcallback(void* param);
    
    void Work();  
    
    
    void deleteOldFile();
    
    
    void scanfLogFile();
    
    void scanfLogFilebyTime();
	
    void getFileIndex(int *ps32Head, int *ps32Tail);
 
    
    
    void delLogFile(int index);

    void delLogFileByTime(long time);
    void delDirFileByTime(long time,int type);
    void detectcurfile();
    
   
    void addLogFile(int index);
    
    /**
     * 获得文件夹的大小
     * @param dirPath 文件夹路径
     * @return 文件夹大小
     */
    unsigned long getDirSize(char *dirPath);

	unsigned long getDirFileCount(char *dirPath);
        
        unsigned long getDirCount(char *dirPath);

	unsigned long scanfDirFilebyTime(char *dirPath,int type);//获取目录下的文件夹时间

	char* GetLogNameByTime(long time);
    
    char* GetImageDirNameByTime(long time);

	char* GetFlymapOutDirNameByTime(long time);

	void _del_char(char a[], char c);
    
    bool _isTimeStr(const char *s);
    
    void _sortLogFileList(vector<LOGFILE_INFO> &vec);
    
    static bool LogComparison(LOGFILE_INFO a,LOGFILE_INFO b);

	void _sortImageDirList(vector<ImageDir_INFO> &vec);

	static bool ImageComparison(ImageDir_INFO a, ImageDir_INFO b);

	void _sortFlyMapOutDirList(vector<FlyMapOutDir_INFO> &vec);
   
	static bool FlyMapOutComparison(FlyMapOutDir_INFO a, FlyMapOutDir_INFO b);

        void AutoDetectFlyMapOutDir();

	void AutoDetectImageDir();
public:    
    char *pszPokyLogName;
    
private:
    char *szFilePath;
    
    pthread_t   m_pid;              //检测日志目录线程;如果发现目录过大，会删除一些旧的日志文件；如果发现某一个日志文件过大，写到下一个文件
    LOG_PokyFile  m_filelist;         //文件列表，存放文件列表的下标号码
    LOG_PokyTimeFile m_filetimelist;  //存日志文件时间和对应的文件名
    Image_PokyTimeFile m_imagedirtimelist;//存IMAGE文件夹目录时间和对应的目录名
    FlyMapOut_PokyTimeFile m_outdirtimelist;//存解算输出文件夹目录时间和对应的目录名
    int         m_curfile;          //当前写入的日志文件下标号码
    int         m_running;          //线程工作标志
};

#endif /* LOGDIRCTRL_H */

